(require 'srfi-1)
(define cria-sala
  (lambda (nome
      descricao
      saida-norte
      saida-sul
      saida-leste
      saida-oeste
      objetos
      personagens)
    (let
	((self-nome nome)
          (self-descricao descricao)
          (self-saida-norte saida-norte)
          (self-saida-sul saida-sul)
          (self-saida-leste saida-leste)
          (self-saida-oeste saida-oeste)
          (self-objetos objetos)
          (self-personagens personagens))
      (lambda (selector)

	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        (cond ((eq? selector 'get-nome)
               (lambda ()
                 self-nome))

              ((eq? selector 'set-nome)
               (lambda (novo-nome)
                 (set! self-nome novo-nome)))
	      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
              ((eq? selector 'get-descricao)
               (lambda ()
                 self-descricao))

              ((eq? selector 'set-descricao)
               (lambda (nova-descricao)
                 (set! self-descricao nova-descricao)))
	      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
              ((eq? selector 'get-saida-norte)
               (lambda ()
                 self-saida-norte))

              ((eq? selector 'set-saida-norte)
               (lambda (nova-saida-norte)
                 (set! self-saida-norte nova-saida-norte)))
	      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
              ((eq? selector 'get-saida-sul)
               (lambda ()
                 self-saida-sul))

              ((eq? selector 'set-saida-sul)
               (lambda (nova-saida-sul)
                 (set! self-saida-sul nova-saida-sul)))
	      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
              ((eq? selector 'get-saida-leste)
               (lambda ()
                 self-saida-leste))

              ((eq? selector 'set-saida-leste)
               (lambda (nova-saida-leste)
                 (set! self-saida-leste nova-saida-leste)))
	      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
              ((eq? selector 'get-saida-oeste)
               (lambda ()
                 self-saida-oeste))

              ((eq? selector 'set-saida-oeste)
               (lambda (nova-saida-oeste)
                 (set! self-saida-oeste nova-saida-oeste)))
	      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	      ;;;;;;;;;;;;;;;;;;;;;;;;;;;
              ((eq? selector 'get-objetos)
               (lambda ()
                 self-objetos))

              ((eq? selector 'set-objetos)
               (lambda (novos-objetos)
                 (set! self-objetos novos-objetos)))
	      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
              ((eq? selector 'get-personagens)
               (lambda ()
		 (for-each (lambda (i) (print ((i 'get-nome)) ", ")) self-personagens)))
	
              ((eq? selector 'set-personagens)
               (lambda (novos-personagens)
                 (set! self-personagens novos-personagens)))
	      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	      ;;;;;;;;;;;;;;;;;;;;;;;;;;
              ((eq? selector 'tem-objeto?)
               (lambda (objeto)
                 (if (memq objeto self-objetos) #t #f)))

              ((eq? selector 'add-objeto)
               (lambda (objeto)
                 (set! self-objetos (append! self-objetos (list objeto)))))

              ((eq? selector 'del-objeto)
               (lambda (objeto)
                 (set! self-objetos (delete! objeto self-objetos))))
	      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	      ((eq? selector 'tem-personagem?)
	       (lambda (personagem)
		 (if (memq personagem self-personagens) #t #f)))

	      ((eq? selector 'add-personagem)
	       (lambda (personagem)
		 (set! self-personagens (append! self-personagens (list personagem)))))

	      ((eq? selector 'del-personagem)
	       (lambda (personagem)
		 (set! self-personagens (delete! personagem self-personagens))))      
	      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	      
              (else
	       #f))))))

;;USO:
;; (define s1 (cria-sala "Quarto" "Um quarto comum" 's3 's2 's4 's5 '(a b c) '()))
;; (define s2 (cria-sala  "Um outro Quarto" "Uma suíte presidencial" '() "s1" '() '() '() '()))

;; ((s1 'get-nome))
;; ((s1 'set-nome) "Quartinho")

;; ((s1 'get-descricao))
;; ((s1 'set-descricao) "Nova Descrição")

;; ((s1 'get-saida-norte))
;; ((s1 'set-saida-norte) 's1)

;; ((s1 'get-saida-sul))
;; ((s1 'set-saida-sul) 's1)

;; ((s1 'get-saida-leste))
;; ((s1 'set-saida-leste) 's3)

;; ((s1 'get-objetos))
;; ((s1 'set-objetos) '())

;; ((s1 'get-personagens))
;; ((s1 'set-personagens) '(Joao Maria Eduardo))

;; ((s1 'tem-objeto) 'g)
;; ((s1 'add-objeto) 'g)
;; ((s1 'del-objeto) 'g)

;; ((s1 'tem-personagem) 'Joao)
;; ((s1 'add-personagem) 'Mariana)
;; ((s1 'del-personagem) 'Joao)
;; ;;(list-index (lambda (i) (if (eq? 7 i) i #f)) a)

;; ;; (define first-index-of
;; ;;   (lambda (el lista)
;; ;;     (list-index (lambda (i) (if (eq? el i) i #f)) lista)
;; ;;     ))
